[DP][分治]消失之物
消失之物
Time Limit: 10 Sec Memory Limit: 128 MB
Description
ftiasch 有 N 个物品, 体积分别是 W1, W2, …, WN。
由于她的疏忽, 第 i 个物品丢失了.
“要使用剩下的 N - 1 物品装满容积为 x 的背包,有几种方法呢?” – 这是经典的问题了。
她把答案记为 Count(i, x) ,想要得到所有1 <= i <= N, 1 <= x <= M的 Count(i, x) 表格。
Input
第1行:两个整数 N 和 M ,物品的数量和最大的容积。
第2行: N 个整数 W1, W2, …, WN, 物品的体积。
Output
一个 N × M 的矩阵, *Count(i, x)*的末位数字。
Sample Input
3 2
1 1 2
Sample Output
11
11
21
HINT
1 ≤ N ≤ 2 × 1e3, 1 ≤ M ≤ 2 × 1e3
Solution
首先,我们发现,对于L,R:
去掉L,就是要用**[1, L - 1]∪[L + 1, n]的物品来求解;
去掉R,就是要用[1, R - 1]∪[R + 1, n]的物品来求解。
若是我们更新完了([1, L - 1]∪[L + 1, n])∩([1, R - 1]∪[R + 1, n])的部分,
再加上L的,即是去掉R的答案;再加上R的,即是去掉L**的答案。
那么我们就可以考虑分治:
设计状态Solve(L, R),表示已经做完了[1, L - 1]∪[R + 1, n]时的答案。
然后二分一个mid = L + R >> 1;
要处理**[L, mid]则将[mid + 1, R]的更新一下,反之同理。
那么这样我们最后做到L == R**时候,显然就是去掉L的答案了。
DP部分显然就是一个简单的背包。
Code
1 |
|
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.